package com.example.common.unit.PageUtil;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.common.unit.PageUtil.PageParam;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ghy
 * @date 2025/08/20
 * @description 分页工具类
 */
public class PageUtil {

    /**
     * 创建分页对象
     *
     * @param current 当前页码
     * @param size    每页显示数量
     * @param <T>     泛型类型
     * @return 分页对象
     */
    public static <T> Page<T> newPage(long current, long size) {
        return new Page<>(current, size);
    }

    /**
     * 创建分页对象
     *
     * @param pageParam 分页参数
     * @param <T>       泛型类型
     * @return 分页对象
     */
    public static <T> Page<T> newPage(PageParam pageParam) {
        return new Page<>(pageParam.getCurrent(), pageParam.getSize());
    }

    /**
     * 创建默认分页对象(第1页，每页10条)
     *
     * @param <T> 泛型类型
     * @return 分页对象
     */
    public static <T> Page<T> newPage() {
        return new Page<>(1, 10);
    }

    /**
     * 将MyBatis Plus分页结果转换为通用分页结果
     *
     * @param page MyBatis Plus分页结果
     * @param <T>  泛型类型
     * @return 通用分页结果Map
     */
    public static <T> Map<String, Object> toPageResult(IPage<T> page) {
        Map<String, Object> result = new HashMap<>();
        result.put("records", page.getRecords());
        result.put("total", page.getTotal());
        result.put("size", page.getSize());
        result.put("current", page.getCurrent());
        result.put("pages", page.getPages());
        result.put("hasNext", page.getCurrent() < page.getPages());
        result.put("hasPrevious", page.getCurrent() > 1);
        return result;
    }

    /**
     * 创建分页结果对象
     *
     * @param records 数据列表
     * @param total   总记录数
     * @param current 当前页码
     * @param size    每页显示数量
     * @param <T>     泛型类型
     * @return 分页结果Map
     */
    public static <T> Map<String, Object> newPageResult(java.util.List<T> records, long total, long current, long size) {
        Map<String, Object> result = new HashMap<>();
        result.put("records", records);
        result.put("total", total);
        result.put("size", size);
        result.put("current", current);
        result.put("pages", (total + size - 1) / size);
        result.put("hasNext", current * size < total);
        result.put("hasPrevious", current > 1);
        return result;
    }

    /**
     * 创建分页结果对象
     *
     * @param records   数据列表
     * @param total     总记录数
     * @param pageParam 分页参数
     * @param <T>       泛型类型
     * @return 分页结果Map
     */
    public static <T> Map<String, Object> newPageResult(java.util.List<T> records, long total, PageParam pageParam) {
        return newPageResult(records, total, pageParam.getCurrent(), pageParam.getSize());
    }
}
